package com.yonyou.cyxdms.basedata.service.service.product;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yonyou.cyx.framework.service.base.ICommonService;
import com.yonyou.cyxdms.basedata.client.domains.vo.VehicleInfoVO;
import com.yonyou.cyxdms.basedata.client.domains.vo.VsMasterInfoVO;
import com.yonyou.cyxdms.basedata.client.domains.vo.VsOptionVO;
import com.yonyou.cyxdms.basedata.client.domains.vo.VsProductIdVO;
import com.yonyou.cyxdms.basedata.client.dto.option.VsOptionDTO;
import com.yonyou.cyxdms.basedata.client.dto.product.TtVsPlanTemplateDTO;
import com.yonyou.cyxdms.basedata.client.dto.product.VehicleInfoDTO;
import com.yonyou.cyxdms.basedata.client.dto.wholesales.PlanTemplateDTO;
import com.yonyou.cyxdms.basedata.service.dto.DirectivePriceDTO;
import com.yonyou.cyxdms.basedata.service.dto.ProductTreeDTO;
import com.yonyou.cyxdms.basedata.service.dto.VsProductDTO;
import com.yonyou.cyxdms.basedata.service.dto.VsProductPriceDTO;
import com.yonyou.cyxdms.basedata.service.dto.outapi.CmsApp04;
import com.yonyou.cyxdms.basedata.service.dto.outapi.CmsApp04QueryDto;
import com.yonyou.cyxdms.basedata.service.dto.sap.CMS008ReqDTO;
import com.yonyou.cyxdms.basedata.service.dto.sap.CMS009ReqDTO;
import com.yonyou.cyxdms.basedata.service.dto.sap.CMSVHCL003ReqDTO;
import com.yonyou.cyxdms.basedata.service.dto.vehiclemaster.VehicleMasterInfoDTO;
import com.yonyou.cyxdms.basedata.service.dto.vehiclemodel.GeneralVsProductDTO;
import com.yonyou.cyxdms.basedata.service.dto.vehiclemodel.ProductQueryDTO;
import com.yonyou.cyxdms.basedata.service.entity.product.VsProductPO;
import com.yonyou.cyxdms.basedata.service.entity.sap.CMS008PO;
import com.yonyou.cyxdms.basedata.service.vo.*;
import com.yonyou.cyxdms.basedata.service.vo.productinfo.*;
import com.yonyou.cyxdms.basedata.service.vo.productprice.SaveProductPriceVO;
import com.yonyou.cyxdms.framework.bean.dto.user_info.LoginInfoDto;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 定义车辆产品，一个车辆产品表示一类车辆，车辆产品定义即可以由车厂下发，也可以自定义 服务类
 * </p>
 *
 * @author renwd
 * @since 2019-01-18
 */
public interface VsProductService extends ICommonService<VsProductDTO, VsProductPO, Integer> {

    /**
     * 根据五级车型查询销售指导价
     *
     * @param directivePriceDTO
     * @return com.yonyou.cyxdms.basedata.service.entity.product.SalesGuidancePriceVO
     * @author renwd
     * @since 2019/2/20
     */
    SalesGuidancePriceVO selectDirectivePrice(DirectivePriceDTO directivePriceDTO);

    /**
     * 根据productId查询销售指导价
     *
     * @param ownerCode
     * @param productId
     * @return
     * @author ysj
     * @date 2019/09/16
     */
    SalesGuidancePriceVO selectDirectivePriceByProductId(Long productId);

    /**
     * 根据车系Id 检索车系列表
     *
     * @param serialId
     * @return
     * @author Zhangsx
     * @date 2018年9月3日
     */
    public List<CarparamVO> querySerial(Long serialId);

    /**
     * 根据经销商Id检索车系信息
     *
     * @param brandId
     * @return void
     * @author zhangsx
     * @since 2018/9/14
     */
    public SerialVo querySerialInfo(Integer brandId);

    /**
     * 获取车型详细信息
     *
     * @param carId
     * @param colorId
     * @return com.yonyou.cyx.base.service.entity.carparam.CarBaseInfoVO
     * @author zhangsx
     * @since 2018/9/12
     */
    public CarBaseInfoVO findCarInfo(Integer carId, Integer colorId);

    /**
     * 查询品牌车系车型配置信息
     *
     * @param map
     * @return java.util.Map<java.lang.String, java.lang.Object>
     * @author renwd
     * @since 2018/11/26
     */
    public Map<String, Object> queryModelByCondition(Map<String, Object> map);

    /**
     * 根据车系id获取车系
     *
     * @author dengqiang
     * @since 2019/1/21
     */
    public IPage<CarparamInfoVO> queryCarparamInfo(Long brandId, Long carserialId, Long pageNum, Long pageSize);

    /**
     * 根据车系ID列表查询车型信息
     *
     * @author dengqiang
     * @since 2019/1/7
     */
    public List<GroupCarparamInVO> queryCarparamInfo(Long carserialId);

    public List<GroupCarparamInVO> getCarparamInfo(List<CarparamInVO> carParamInVos);

    /**
     * 查询整车产品信息
     *
     * @param page
     * @param queryParam
     * @return com.baomidou.mybatisplus.core.metadata.IPage<com.yonyou.cyxdms.basedata.service.vo.productinfo.VsProductVO>
     * @author renwd
     * @since 2019/7/17
     */
    IPage<VsProductVO> queryProductInfo(Page page, Map<String, Object> queryParam);
    
    /**
     * 查询整车产品信息
     *
     * @param page
     * @param queryParam
     * @return com.baomidou.mybatisplus.core.metadata.IPage<com.yonyou.cyxdms.basedata.service.vo.productinfo.VsProductVO>
     * @author zys
     * @since 2020/2/12
     */
    IPage<VsProductVO> queryProductInfoV2(Page page, Map<String, Object> queryParam);

    /**
     * 查询Dcs整车产品信息
     *
     * @param page
     * @param queryParam
     * @return com.baomidou.mybatisplus.core.metadata.IPage<com.yonyou.cyxdms.basedata.service.vo.productinfo.VsProductVO>
     * @author renwd
     * @since 2019/7/17
     */
    IPage<DcsVsProductVO> queryDcsProductInfo(Page page, Map<String, Object> queryParam);
    
    /**
     * 查询Dcs整车产品信息
     *
     * @param page
     * @param queryParam
     * @return com.baomidou.mybatisplus.core.metadata.IPage<com.yonyou.cyxdms.basedata.service.vo.productinfo.VsProductVO>
     * @author zys
     * @since 2020/2/11
     */
    IPage<DcsVsProductVO> queryDcsProductInfoV2(Page page, Map<String, Object> queryParam);

    /**
     * 导出
     *
     * @param queryParam
     * @return void
     * @author renwd
     * @since 2019/7/18
     */
    void exportProductInfos(Map<String, Object> queryParam, HttpServletRequest request, HttpServletResponse response);
    
    /**
     * 导出
     *
     * @param queryParam
     * @return void
     * @author zys
     * @since 2020/2/11
     */
    void exportProductInfosV2(Map<String, Object> queryParam, HttpServletRequest request, HttpServletResponse response);

    /**
     * dcs查询整车产品信息
     *
     * @param page
     * @param queryParam
     * @return com.baomidou.mybatisplus.core.metadata.IPage<com.yonyou.cyxdms.basedata.service.vo.productinfo.VsProductVO>
     * @author renwd
     * @since 2019/7/19
     */
    IPage<VsProductVO> queryVehicleMasterInfo(Page page, Map<String, Object> queryParam);

    /**
     * 根据id查询主数据
     *
     * @param id
     * @return com.yonyou.cyxdms.basedata.service.vo.productinfo.VsMasterInfoVO
     * @author renwd
     * @since 2019/7/24
     */
    VsMasterInfoVO queryProductInfoById(Long id);

    /**
     * TCC获取车辆主数据
     *
     * @param id
     * @return
     * @auhtor ysj
     * @date 2019/11/19
     */
    VsMasterInfoVO queryTccProductInfoById(Long id);

    /**
     * 修改主数据
     *
     * @param id
     * @param vehiclemasterinfodto
     * @return void
     * @author renwd
     * @since 2019/7/24
     */
    void modifyProductInfo(Long id, VehicleMasterInfoDTO vehiclemasterinfodto);

    /**
     * 获取配置树
     *
     * @param productTreeDTO
     * @return
     * @author ysj
     * @date 2019/09/10
     */
    List<BrandTreeVO> getProductTree(ProductTreeDTO productTreeDTO);
    
    
    /**
     * 获取配置树 (增加层级 选装)
     *
     * @param productTreeDTO
     * @return
     * @author zy
     * @date 2020/02/10
     */
    List<BrandTreeNewVO> getProductTreeNew(ProductTreeDTO productTreeDTO);
    
    /**
     * 获取配置树(2020/1/6 更改报价管理新增-购买车型-颜色更改为产品)
     *
     * @param productTreeDTO
     * @return
     * @author zys
     * @date 2020/01/06
     */
    List<BrandTreeNewVO> getProductTree1(ProductTreeDTO productTreeDTO);

    /**
     * 根据车辆配置名称查询ID
     *
     * @param vehicleInfoDTO
     * @return
     * @author ysj
     * @date 2019/10/21
     */
    VehicleInfoVO getVehicleInfoByName(VehicleInfoDTO vehicleInfoDTO);

    /**
     * 通过产品代码查出productIds
     *
     * @param productCode
     * @return java.util.List<java.lang.Long>
     * @author dengqiang
     * @since 2019/10/22
     */
    List<Long> queryProductIdsBy(String productCode);

    /**
     * 通用-新增/更新定义整车产品
     *
     * @author：chenzb
     * @since：2019-10-12
     */
    void addVsProductGeneral(List<GeneralVsProductDTO> generalVsProductDto);

    /**
     * 更新-车辆主数据
     * 整车物料号价格维护
     *
     * @param vsProductPriceDTO
     * @author：chenzb
     * @since：2019-11-27
     */
    Integer updateProductInfo(VsProductPriceDTO vsProductPriceDTO);

    /**
     * 添加-车辆主数据
     * 整车物料号价格维护
     *
     * @param saveProductPriceVO
     * @author：lijun
     * @since：2019-12-17
     */
    Integer saveProductInfo(SaveProductPriceVO saveProductPriceVO);
    
    /**
     * 添加-车辆主数据
     * 整车物料号价格维护
     *
     * @param saveProductPriceVO
     * @author：lijun
     * @since：2019-12-17
     */
    Integer saveProductInfoV2(SaveProductPriceVO saveProductPriceVO);

    List<VsProductVO> getAllProductByAppId(String appId);

    /**
     * 查询整车编码信息
     *
     * @param page, productQueryDTO
     * @return com.baomidou.mybatisplus.core.metadata.IPage<com.yonyou.cyxdms.basedata.service.vo.productinfo.VsProductVO>
     * @author caozx
     * @since 2020/12/14
     */
    IPage<VsProductVO> getProductInfo(Page page, ProductQueryDTO productQueryDTO);

    /**
     * 查询经销商物料价格
     */
    IPage<VsProductVO> getProductPrice(Page page, ProductQueryDTO productQueryDTO);

    /**
     * 查询整车编码信息-已下发
     *
     * @param page, productQueryDTO
     * @return com.baomidou.mybatisplus.core.metadata.IPage<com.yonyou.cyxdms.basedata.service.vo.productinfo.VsProductVO>
     * @author caozx
     * @since 2021/01/13
     */
    IPage<VsProductPriceInfoDealerExcelVO> getProductInfoDealer(Page page, ProductQueryDTO productQueryDTO);

    /**
     * 查询整车编码信息[无分页]
     *
     * @param  productQueryDTO
     * @return com.baomidou.mybatisplus.core.metadata.IPage<com.yonyou.cyxdms.basedata.service.vo.productinfo.VsProductVO>
     * @author caozx
     * @since 2020/12/14
     */
    List<VsProductVO> getProductInfoList( VsOptionDTO productQueryDTO);

    Map<String, Object> setLoginInfoParam(Map<String, Object> queryParam, LoginInfoDto loginInfoDto);

    List<PlanTemplateDTO> getPlanTemplates(List<String> productCodes);

    /**
     * 下发产品信息
     *
     * @param vsProductVO
     * @return java.lang.Integer
     * @author caozx
     * @since 2020/12/17
     */
    Integer issueProduct(@RequestBody ProductInfosVO vsProductVO);

    /**
     * 产品信息是否可订购
     *
     * @param vsProductVO
     * @return java.lang.Integer
     * @author caozx
     * @since 2020/12/17
     */
    Integer updateOrderStatus(@RequestBody ProductInfosVO vsProductVO);

    /**
     * 整车编码信息导出
     *
     * @return void
     * @author caozx
     * @since 2020/12/17
     */
    void exportProducts(HttpServletResponse response,ProductQueryDTO dto);

    CmsApp04 searchCmsApp04Data(CmsApp04QueryDto cmsApp04QueryDto);

    /**
     * 新能源SAP-更新销售指导价
     *
     * @param cms008ReqDTO
     * @return java.lang.Integer
     * @author caozx
     * @since 2021/01/21
     */
    Integer sapUpdateProductPirce(CMS008ReqDTO cms008ReqDTO);

    /**
     * 股份SAP-更新销售指导价
     *
     * @param cmsvhcl003ReqDTO
     * @return java.lang.Integer
     * @author caozx
     * @since 2021/02/05
     */
    Integer sapSharesUpdateProductPirce(CMSVHCL003ReqDTO cmsvhcl003ReqDTO);

    /**
     * 股份SAP-批量更新销售指导价
     *
     * @param
     * @return java.lang.Integer
     * @author caozx
     * @since 2021/02/07
     */
    Boolean sapSharesbatchUpdateProductPirce();

    /**
     * 新能源SAP-更新国补地补金额
     *
     * @param cms009ReqDTO
     * @return java.lang.Integer
     * @author caozx
     * @since 2021/01/21
     */
    Integer sapUpdateProductSubsidies(CMS009ReqDTO cms009ReqDTO);

    /**
     * 获取产品信息
     *
     * @param productCode
     * @return java.util.List<com.yonyou.cyxdms.basedata.service.vo.productinfo.VsProductVO>
     * @author caozx
     * @since 2021/01/28
     */
    VsProductVO getProduct(String productCode);

    /**
     * 获取产品信息
     *
     * @param productCode
     * @return com.yonyou.cyxdms.basedata.service.vo.VsProductDlrVO
     * @author caozx
     * @since 2021/02/22
     */
    VsProductDlrVO getProductNew(String productCode);

    Map<String, List<ExportMsgVO>> checkSaveImportList(List<SaveProductPriceImportVO> list, Integer titleRows, Integer headerRows);

    void updateSubsidyAmount();

    IPage<TtVsPlanTemplateDTO> queryCarListSideC(Page<TtVsPlanTemplateDTO> page, TtVsPlanTemplateDTO dto);


    List<TtVsPlanTemplateDTO> queryPlan1DetailProductInfo(List<String> cdtos);

    void excelOem(ProductQueryDTO dto, HttpServletResponse response);

    void exportProductsPrice(HttpServletResponse response,ProductQueryDTO dto);

    void exportTemplate(HttpServletResponse response);

    Map<String, List<ExportMsgVO>> checkImportList(List<SaveImportExcelVO> list, Integer titleRows, Integer headerRows);

    void sapInsertInterface(TiProductPriceDataVO vo);

    void updateProductPrice(VsProductDTO dto);

    List<TiProductPriceDataVO> queryProductPriceLog(Integer type);

    void updateProductPriceLog(TiProductPriceDataVO vo);

    void exportInfoDealer(Page<VsProductPriceInfoDealerExcelVO> page, ProductQueryDTO productQueryDTO,HttpServletResponse response);
}
